{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([-1.1483,  1.1537]), tensor([-2.0125]))"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 我们定义目标为Y = Xw + b + ε\n",
    "# 先要生成训练用数据\n",
    "true_w = torch.tensor([2, -3.4]).reshape((2,1))\n",
    "true_b = 4.2\n",
    "\n",
    "X = torch.normal(0, 1, (1000, 2)) # 输入\n",
    "Y = X.matmul(true_w) + true_b\n",
    "Y += torch.normal(0, 0.01, Y.shape) # 带噪声的真实输出\n",
    "X[0], Y[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(-3, 0, 'The second feature and label')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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WGRlZeGrr76yf//TTz/FlVdeiZiYGKSnp+OVV15xev709HS8+OKLuO+++5CYmIh27drhnXfecbomPz8fPXv2RGxsLHr37o2ff/7Z4+t53XXX4ZVXXsG3334Lg8GA6667DgBgsVjw6KOPok2bNoiPj8fVV1+Nb775xv648vJyjB07Fm3atEFcXByuuuoqrFixwv79e+65B1u2bMGiRYvsq1UHDx7E0qVLkZyc7DSGzz//HAbDpX8IhW2N9957DxkZGYiNjbW/fv/3f/+HFi1aICkpCYMHD8auXbs8/nxPPPEEunTpgri4OHTo0AEzZ85EXd2lBELhuf75z38iPT0dRqMRY8aMwdmzZ+3XVFdX4+6770ZCQgLS0tLcfi/eREYYMCajFmUrn8WRf9yBwwtuR9nyJ2EpO+B2bX31aZz8eBYOv3Iz7hzSB5988onT9/+54Sfccuvt2D5nFI4sGoOTn87FhcoTqLxYkROo4+fJmad5XMj72PbU9VgxoR8WjemBFRP64fsnBuPh3M4Y1aMNcjo2Q2SEQdNtFCUn81J44L8OOnjmmWfwyiuv4KeffkKTJk1w33332b/33Xff4e6778bDDz+MoqIivP3221i6dCleeOEF0XtduHABo0ePxrXXXovdu3cjLy8PEydOtE+g3u5ntVpxww03YOvWrVi2bBmKiorw0ksvITKyoZpix44duP322zFmzBj88ssvmD17NmbOnImlS5c6jeOVV16xBxgPPvggJk+ebA+wqqqqcNNNNyEzMxM7duzA7Nmz8eijj3p8jT777DNMmDABOTk5KC0txWeffQYAmDp1KvLy8rBy5Urs3r0bt912G4YNG4b9+/cDAGpqatCrVy+sWbMGhYWFmDhxIu666y7k5+cDABYtWoScnBxMmDABpaWlKC0tRdu2bWX/7g4cOIBPP/0Un332mT2/5bbbbsPJkyfxn//8Bzt27EB2djauv/56VFRI/0OamJiIpUuXoqioCIsWLcK7776LBQsWOF1TXFyMzz//HF999RW++uorbNmyBS+99JL9+4899hi2bNmC1atX4+uvv8Y333yDnTt3yv5ZAOCqljH4ywP346oHFiLtrlcQldIaJz+ZDavlnNN1Z75bhriuf8A7qzbizjvvxJgxY7BnT0OZbo2lFg/ccQsM0U1hunM+THe+DEN0LE58PAvW+joY0BD09G6Xgvv7pyO5qbxKHVJn5vArsODPPTBz+BW4O6c9APe2Zo55H9FNIpDTsZlT4OHI0zbKpGU7sWjDPkXJpjyZl1xxa0YHL7zwAq699loAwJNPPonhw4ejpqYGsbGxmDNnDp588kmMHz8eANChQwfMnTsXjz/+OGbNmuV2L7PZjMrKStx0003o2LEjAOCKK66wf9/b/TZs2ID8/Hzs2bMHXbp0sV8jePXVV3H99ddj5syZAIAuXbqgqKgIL7/8Mu655x77dTfeeCMefPBBAA3v9hcsWIDNmzeja9euWL58OaxWK95//33ExsbiyiuvxNGjRzF58mTJ1yg1NRVxcXGIjo6GydRwVPrhw4exZMkSHD58GK1btwYAPProo1i3bh2WLFmCF198EW3atHEKcv7yl7/gv//9Lz7++GP07dsXRqMR0dHRiIuLs99XidraWnz44Ydo0aIFAOD7779Hfn4+Tp48iZiYGADA3//+d3z++ef45JNPMHHiRNH7PPvss/b/n56ejkcffRQrV67E448/bv+61WrF0qVLkZiYCAC46667sHHjRrzwwguoqqrC+++/j2XLluH6668H0JBTc9lllyn6eQYPHozBgwdj3sVl97LK4Rh7zRVoWv4bLK172q9rftVA/L+Xn2rIE7hpANavX4/XXnsNb7zxBuYtfh919Va0vuEhewDc/MZpOLJwDGoO/4KmGdk4X1sPGCIxc8SVeHp4JhZvOoAFG/YpGivJU2Y+j/e+L3EKHAwGwLFjlNw26962UQBgwYb99q/J6TfDk3nJFQMRHXTr1s3+/9PSGv6DPXnyJNq1a4ddu3Zh69atTisg9fX1qKmpwblz5xAXF+d0r9TUVNxzzz0YOnQohgwZgtzcXNx+++32+3q7X0FBAS677DJ7EOJqz549GDVqlNPX+vfvj4ULF6K+vt6+cuL4MwnbUidPnrTfo1u3bvatDADIycmR/4Jd9Msvv6C+vt5trBaLBc2aNbP/bC+++CI+/vhjHDt2DLW1tbBYLG6vm1rt27e3ByFAw+tbVVVlf37B+fPnUVxcLHmfjz76CP/4xz9QXFyMqqoqXLhwwa3pT3p6uj0IARr+VoTXtLi4GLW1tbj66qvt309NTUXXrl0V/TwnTpzAs88+i2+++QYnT55EfX09as+fw1+uTkGvYf1w8mwNRs8H5k++1WlyycnJsa8I7d69CxdOH8eRBbc53dt2oRYXzpTZP7dcsAJoWB15OLczupoS8Ngnu3G2Rnrb0VFCTBNUWy741EbetbFXMMjJaIbOpgScPV+HVQXHfb7fu98ddPua8DPf3z8duZkm2fkd3rZRXMk5l4Yn85Irvwcir7/+Ol5++WWUlZWhe/fueO2119C3b19/P21Qi4q6lMAnvIO0Whv+ka6qqsKcOXNw8803uz3OcSJ3tGTJEjz00ENYt24dPvroIzz77LNYv349+vXr5/V+TZs21eJHcvqZgIafS/iZtFJVVYXIyEjs2LHDHgAJhBycl19+GYsWLcLChQtx1VVXIT4+HtOmTUNtba3YLe0iIiLg2mTYMWdDEB8f7zamtLQ0pzwVgWvOiSAvLw933nkn5syZg6FDh8JoNGLlypVuOR6BeE3Hjx+P8vJyLFq0CO3bt0dMTAxycnJwoa7OqZV3hIdJy3DBgmhTJzQf4b7dFhl3qdIpxiVPZFhWGqot9Xjk357zaQDg3j+k4+oOqZi0TNnWk6tgC0IAIK+kHHkl/j/F2ABgbWEZnh6eKTv5VOn2iJxkU57MS678Goh89NFHmDFjBt566y1cffXVWLhwIYYOHYrffvsNLVu29OdTN1rZ2dn47bff0KlTJ0WP69mzJ3r27ImnnnoKOTk5WL58Ofr16+f1ft26dcPRo0exb98+0VWRK664Alu3bnX62tatW9GlSxe3YEDKFVdcgX/+85/27ScA2LZtm6KfD2j4Gevr63Hy5Elcc801otds3boVo0aNwrhx4wA0BHj79u1DZualJlvR0dGor693elyLFi1w9uxZVFdX24MNTz1OBNnZ2SgrK0OTJk2Qnp4u6+f44Ycf0L59ezzzzDP2rzkmF8vRsWNHREVFYfv27WjXrh0A4PTp09i3b59920+OrVu34o033sCNN94IADhy5AhOnTrldt22bdtw9913O33es2fD1s3QgTn4YtWnaBKXDEOM+8qTAUDT6EikxLlXGB09fc7ta2L+eKUJ3/x2Qta1JM4xCbTyfK1bhZPYtoqa7RHH55E6l4Yn85IjvwYir776KiZMmIB7770XAPDWW29hzZo1+OCDD/Dkk0/686kbreeeew433XQT2rVrh1tvvRURERHYtWsXCgsL8de/ujeEKikpwTvvvIORI0eidevW+O2337B//377pOHtftdeey0GDhyIW265Ba+++io6deqEvXv3wmAwYNiwYXjkkUfQp08fzJ07F3/+85+Rl5eHxYsX44033pD9M91xxx145plnMGHCBDz11FM4ePAg/v73vyt+bbp06YI777wTd999N1555RX07NkTv//+OzZu3Ihu3bph+PDh6Ny5Mz755BP88MMPSElJwauvvooTJ044BSLp6enYvn07Dh48iISEBKSmpuLqq69GXFwcnn76aTz00EPYvn27W0KumNzcXOTk5GD06NH429/+hi5duuD48eNYs2YN/vSnP6F3795uj+ncuTMOHz6MlStXok+fPlizZg1WrVql6LVISEjA/fffj8ceewzNmjVDy5Yt8cwzzyAiQln+eefOnfHPf/4TvXv3htlsxmOPPSa6Svbvf/8bvXv3xoABA/Cvf/0L+fn5eP/99wEAd901DnPnzcfJz+YiecCdiEhsjnrzSZzblwdj31vQJKk5elyWDIPB4vQuvHlCDJZv9x6ApRljUX62Bm9/W6LoZyNx64vKsGTrQbdtEbFtFbUl3oD31RSezEsCv1XN1NbWYseOHcjNzb30ZBERyM3NRV5enuhjLBYLzGaz00e4GTp0KL766it8/fXX6NOnD/r164cFCxagffv2otfHxcVh7969uOWWW9ClSxdMnDgRU6ZMwQMPPCD7fp9++in69OmDsWPHIjMzE48//rh9xSA7Oxsff/wxVq5ciaysLDz33HN4/vnnnRJVvUlISMCXX36JX375BT179sQzzzyD+fPnq3p9lixZgrvvvhuPPPIIunbtitGjR+PHH3+0rwo8++yzyM7OxtChQ3HdddfBZDJh9OjRTvd49NFHERkZiczMTLRo0QKHDx9Gamoqli1bhrVr19pLfuU0oTMYDFi7di0GDhyIe++9F126dMGYMWNw6NAhtGrVSvQxI0eOxPTp0zF16lT06NEDP/zwgz0ZWImXX34Z11xzDUaMGIHc3FwMGDAAvXr1UnSP999/H6dPn0Z2djbuuusuPPTQQ6KrlXPmzMHKlSvRrVs3fPjhh1ixYoU9uIuLi8NP27aif4/LcerzeTj+3mSU/+cfsF2ohalFCt4cl402KU1x0lzjVAJ653vbceKs5y0zAPhz77Z47stfFf1cYpKbNuEZOAD+veOox+RTxzb+ji37lb52clZTIiMMHit2KDz47fTd48ePo02bNvjh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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 观察一下特征和标签的关系\n",
    "x1 = X[:, 0]\n",
    "x2 = X[:, 1]\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.scatter(x2,Y)\n",
    "plt.text(-3, 0, \"The second feature and label\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义一个函数，从数据集中抽取指定数量的样本\n",
    "def data_choose_batch(batch_size, features, labels):\n",
    "    num_examples = len(labels)\n",
    "    index = list(range(num_examples))\n",
    "    random.shuffle(index) # 打乱顺序\n",
    "    for i in range(0, num_examples, batch_size):\n",
    "        batch_index = torch.tensor(\n",
    "            index[i: min(i+batch_size, num_examples)])\n",
    "        yield features[batch_index], labels[batch_index] # 返回一个后在这里停住，下一次调用继续，不用每次进来都执行前面，充分利用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[-0.3655, -1.9007],\n",
      "        [-0.2701, -0.3525],\n",
      "        [ 0.0065, -1.4432],\n",
      "        [-0.6823, -0.4082],\n",
      "        [ 0.1366,  0.7575],\n",
      "        [ 0.8857,  0.5352],\n",
      "        [ 1.9948, -0.8233],\n",
      "        [-0.0691, -0.1184],\n",
      "        [-0.8941, -0.1779],\n",
      "        [ 0.0031, -2.2124]]) tensor([[ 9.9282],\n",
      "        [ 4.8423],\n",
      "        [ 9.1240],\n",
      "        [ 4.2149],\n",
      "        [ 1.9058],\n",
      "        [ 4.1434],\n",
      "        [10.9832],\n",
      "        [ 4.4546],\n",
      "        [ 3.0037],\n",
      "        [11.7281]])\n",
      "tensor([[ 2.6791,  0.4997],\n",
      "        [ 0.7285,  2.4324],\n",
      "        [ 0.8233,  0.2826],\n",
      "        [ 0.1333, -0.0814],\n",
      "        [-0.4851,  0.4760],\n",
      "        [-0.4698, -0.2263],\n",
      "        [-0.5033,  1.1212],\n",
      "        [ 0.9191,  0.7157],\n",
      "        [ 0.3753,  0.3840],\n",
      "        [ 1.1957, -1.5327]]) tensor([[ 7.8485],\n",
      "        [-2.6258],\n",
      "        [ 4.8858],\n",
      "        [ 4.7338],\n",
      "        [ 1.6206],\n",
      "        [ 4.0202],\n",
      "        [-0.6392],\n",
      "        [ 3.5939],\n",
      "        [ 3.6371],\n",
      "        [11.8135]])\n",
      "tensor([[-0.1395,  0.9128],\n",
      "        [ 0.3644,  1.1617],\n",
      "        [ 2.5716,  1.0357],\n",
      "        [-0.1192,  1.4039],\n",
      "        [ 1.4494,  1.2095],\n",
      "        [-0.5038,  0.4153],\n",
      "        [-1.0991, -1.1143],\n",
      "        [-0.5569,  1.3091],\n",
      "        [ 0.8197,  0.1907],\n",
      "        [ 0.1044, -0.1840]]) tensor([[ 0.8033],\n",
      "        [ 0.9860],\n",
      "        [ 5.8220],\n",
      "        [-0.8258],\n",
      "        [ 2.9957],\n",
      "        [ 1.7796],\n",
      "        [ 5.7852],\n",
      "        [-1.3760],\n",
      "        [ 5.1902],\n",
      "        [ 5.0415]])\n",
      "tensor([[ 1.6234e+00,  1.5381e+00],\n",
      "        [ 1.8821e-02,  8.1214e-01],\n",
      "        [ 9.9739e-01, -1.3735e+00],\n",
      "        [-4.6256e-01,  7.3068e-01],\n",
      "        [ 9.8806e-01,  6.2561e-01],\n",
      "        [-8.0240e-01, -6.4094e-01],\n",
      "        [ 9.3802e-01, -6.6841e-04],\n",
      "        [ 2.2532e-01,  3.9122e-01],\n",
      "        [-2.3250e+00,  2.0297e+00],\n",
      "        [ 1.2951e+00,  1.8513e-01]]) tensor([[ 2.2199],\n",
      "        [ 1.4779],\n",
      "        [10.8776],\n",
      "        [ 0.7811],\n",
      "        [ 4.0702],\n",
      "        [ 4.7598],\n",
      "        [ 6.0840],\n",
      "        [ 3.3221],\n",
      "        [-7.3666],\n",
      "        [ 6.1615]])\n",
      "tensor([[-1.5204, -0.3693],\n",
      "        [-1.7338, -0.8563],\n",
      "        [ 0.2522,  0.4268],\n",
      "        [ 0.4036,  1.6855],\n",
      "        [ 0.7591, -2.0837],\n",
      "        [ 0.8057,  0.7123],\n",
      "        [-1.7825, -0.5113],\n",
      "        [ 0.6556, -0.3584],\n",
      "        [-0.8446,  0.5063],\n",
      "        [ 0.2356, -1.0374]]) tensor([[ 2.4226],\n",
      "        [ 3.6492],\n",
      "        [ 3.2610],\n",
      "        [-0.7147],\n",
      "        [12.8107],\n",
      "        [ 3.3842],\n",
      "        [ 2.3667],\n",
      "        [ 6.7324],\n",
      "        [ 0.7995],\n",
      "        [ 8.1924]])\n",
      "tensor([[ 0.7539,  2.1561],\n",
      "        [ 0.1013,  0.8697],\n",
      "        [ 2.6249,  1.3703],\n",
      "        [ 0.4295,  0.2776],\n",
      "        [-0.4516,  2.0183],\n",
      "        [-0.9003,  1.4817],\n",
      "        [ 0.6844,  1.0492],\n",
      "        [-0.7441, -0.6328],\n",
      "        [ 0.6373, -0.9455],\n",
      "        [-0.9993, -0.7831]]) tensor([[-1.6235],\n",
      "        [ 1.4645],\n",
      "        [ 4.7910],\n",
      "        [ 4.1189],\n",
      "        [-3.5681],\n",
      "        [-2.6373],\n",
      "        [ 1.9882],\n",
      "        [ 4.8671],\n",
      "        [ 8.6864],\n",
      "        [ 4.8664]])\n",
      "tensor([[-0.3414, -0.4923],\n",
      "        [ 0.0603, -2.1536],\n",
      "        [-1.5368,  0.5706],\n",
      "        [ 2.1355,  0.1455],\n",
      "        [ 0.1163, -0.2400],\n",
      "        [-0.7154,  0.8026],\n",
      "        [-0.6563, -1.2825],\n",
      "        [-0.3594,  0.5303],\n",
      "        [-1.1946, -1.1750],\n",
      "        [-0.6369, -0.2519]]) tensor([[ 5.1720],\n",
      "        [11.6481],\n",
      "        [-0.8232],\n",
      "        [ 7.9778],\n",
      "        [ 5.2559],\n",
      "        [ 0.0551],\n",
      "        [ 7.2338],\n",
      "        [ 1.6767],\n",
      "        [ 5.8118],\n",
      "        [ 3.7936]])\n",
      "tensor([[-0.0805,  1.0200],\n",
      "        [-1.7712,  1.3416],\n",
      "        [-0.5548, -0.5887],\n",
      "        [-1.9407,  0.8166],\n",
      "        [ 2.3154, -0.2657],\n",
      "        [-0.5817, -0.1689],\n",
      "        [ 1.2436,  0.3608],\n",
      "        [-0.5699, -1.4798],\n",
      "        [ 1.0731,  0.5682],\n",
      "        [ 0.7364, -0.3227]]) tensor([[ 0.5703],\n",
      "        [-3.9124],\n",
      "        [ 5.0925],\n",
      "        [-2.4688],\n",
      "        [ 9.7344],\n",
      "        [ 3.6197],\n",
      "        [ 5.4714],\n",
      "        [ 8.0942],\n",
      "        [ 4.4231],\n",
      "        [ 6.7679]])\n",
      "tensor([[ 0.1650, -0.8061],\n",
      "        [ 1.2077, -0.2989],\n",
      "        [-2.1186,  0.2558],\n",
      "        [-1.3244, -0.3653],\n",
      "        [ 1.1692, -0.5008],\n",
      "        [ 0.7634,  1.0919],\n",
      "        [-0.8769,  0.4110],\n",
      "        [-0.5261,  1.1400],\n",
      "        [-0.2022, -0.1540],\n",
      "        [ 0.5985, -0.5412]]) tensor([[ 7.2528],\n",
      "        [ 7.6429],\n",
      "        [-0.9043],\n",
      "        [ 2.8120],\n",
      "        [ 8.2415],\n",
      "        [ 2.0130],\n",
      "        [ 1.0507],\n",
      "        [-0.7288],\n",
      "        [ 4.3221],\n",
      "        [ 7.2244]])\n",
      "tensor([[ 1.4532,  1.3288],\n",
      "        [ 0.4894,  0.2944],\n",
      "        [-0.2757,  0.4484],\n",
      "        [ 0.7806, -0.5861],\n",
      "        [ 0.0893,  2.2688],\n",
      "        [ 0.5702, -0.5369],\n",
      "        [-0.1175,  0.8536],\n",
      "        [ 0.6939,  0.5662],\n",
      "        [ 0.5495,  0.3005],\n",
      "        [-0.5861,  0.3332]]) tensor([[ 2.5985],\n",
      "        [ 4.1665],\n",
      "        [ 2.1070],\n",
      "        [ 7.7468],\n",
      "        [-3.3377],\n",
      "        [ 7.1569],\n",
      "        [ 1.0638],\n",
      "        [ 3.6667],\n",
      "        [ 4.2818],\n",
      "        [ 1.9061]])\n",
      "tensor([[-1.4185,  0.4657],\n",
      "        [-1.1288,  1.0346],\n",
      "        [-0.7006, -1.3398],\n",
      "        [ 0.7859,  0.7999],\n",
      "        [-0.9333,  0.4635],\n",
      "        [ 0.1976,  0.1046],\n",
      "        [-1.0815, -0.6738],\n",
      "        [-0.9808, -0.4886],\n",
      "        [ 0.3950, -0.1205],\n",
      "        [-1.5731,  1.7276]]) tensor([[-0.2083],\n",
      "        [-1.5666],\n",
      "        [ 7.3460],\n",
      "        [ 3.0435],\n",
      "        [ 0.7745],\n",
      "        [ 4.2478],\n",
      "        [ 4.3206],\n",
      "        [ 3.9123],\n",
      "        [ 5.4010],\n",
      "        [-4.8153]])\n",
      "tensor([[ 0.5676, -0.5272],\n",
      "        [-0.5299,  0.2298],\n",
      "        [ 0.5710, -0.0907],\n",
      "        [ 0.1669,  1.1100],\n",
      "        [-0.0582,  0.1156],\n",
      "        [ 2.0400,  0.4676],\n",
      "        [-0.5617, -1.9136],\n",
      "        [ 0.3592,  1.9917],\n",
      "        [ 1.0481,  0.1306],\n",
      "        [-0.3346, -1.3192]]) tensor([[ 7.1308],\n",
      "        [ 2.3552],\n",
      "        [ 5.6458],\n",
      "        [ 0.7604],\n",
      "        [ 3.6913],\n",
      "        [ 6.6719],\n",
      "        [ 9.5846],\n",
      "        [-1.8470],\n",
      "        [ 5.8614],\n",
      "        [ 8.0266]])\n",
      "tensor([[ 0.2842,  0.9381],\n",
      "        [ 1.1681, -0.4940],\n",
      "        [ 0.4386, -0.3173],\n",
      "        [-0.7232, -0.4458],\n",
      "        [-0.0589, -0.8069],\n",
      "        [ 0.3309, -0.7165],\n",
      "        [-0.8437,  0.6926],\n",
      "        [ 0.1224, -0.0191],\n",
      "        [ 1.5485, -0.0310],\n",
      "        [-0.7246, -0.4027]]) tensor([[1.5857],\n",
      "        [8.2095],\n",
      "        [6.1588],\n",
      "        [4.2802],\n",
      "        [6.8150],\n",
      "        [7.3122],\n",
      "        [0.1610],\n",
      "        [4.5209],\n",
      "        [7.4057],\n",
      "        [4.1028]])\n",
      "tensor([[-0.4889, -1.2842],\n",
      "        [-1.1593, -1.2271],\n",
      "        [-0.9135, -1.8785],\n",
      "        [-0.8749,  0.1297],\n",
      "        [ 0.2866,  1.5543],\n",
      "        [ 0.2008, -0.4972],\n",
      "        [-0.5619,  0.8356],\n",
      "        [-0.1111,  1.0423],\n",
      "        [-0.5076,  0.1981],\n",
      "        [-1.3586,  0.8183]]) tensor([[ 7.5769],\n",
      "        [ 6.0658],\n",
      "        [ 8.7427],\n",
      "        [ 2.0157],\n",
      "        [-0.5189],\n",
      "        [ 6.2820],\n",
      "        [ 0.2426],\n",
      "        [ 0.4092],\n",
      "        [ 2.5141],\n",
      "        [-1.3131]])\n",
      "tensor([[ 1.4027,  0.7298],\n",
      "        [ 0.2724,  1.0457],\n",
      "        [ 0.6492,  0.9608],\n",
      "        [ 0.3816, -1.4537],\n",
      "        [-0.2138, -1.0361],\n",
      "        [-0.6777,  2.4341],\n",
      "        [ 0.3914,  0.9275],\n",
      "        [-0.5097, -0.2273],\n",
      "        [ 0.4855,  0.6699],\n",
      "        [-0.4095, -1.0868]]) tensor([[ 4.5095],\n",
      "        [ 1.1868],\n",
      "        [ 2.2081],\n",
      "        [ 9.9102],\n",
      "        [ 7.2943],\n",
      "        [-5.4244],\n",
      "        [ 1.8117],\n",
      "        [ 3.9674],\n",
      "        [ 2.8928],\n",
      "        [ 7.0798]])\n",
      "tensor([[-1.0932,  0.1190],\n",
      "        [ 0.6469,  0.0714],\n",
      "        [ 0.2804, -0.7163],\n",
      "        [ 0.1268,  0.9876],\n",
      "        [-0.0409, -0.1906],\n",
      "        [ 0.9824,  1.3745],\n",
      "        [ 1.4216,  0.1352],\n",
      "        [ 0.9695,  0.8931],\n",
      "        [-0.0225,  0.3293],\n",
      "        [-1.6302, -1.7811]]) tensor([[1.6044],\n",
      "        [5.2399],\n",
      "        [7.1972],\n",
      "        [1.0885],\n",
      "        [4.7520],\n",
      "        [1.4869],\n",
      "        [6.5676],\n",
      "        [3.1241],\n",
      "        [3.0484],\n",
      "        [6.9966]])\n",
      "tensor([[-1.9926, -0.8692],\n",
      "        [ 1.1947,  1.8429],\n",
      "        [-0.2417, -0.4552],\n",
      "        [-1.4737,  0.3856],\n",
      "        [-2.1964,  0.5357],\n",
      "        [-1.5220,  0.2507],\n",
      "        [ 0.3554, -1.8173],\n",
      "        [-0.8724, -0.0063],\n",
      "        [-0.2737,  0.5022],\n",
      "        [-1.6494, -0.3738]]) tensor([[ 3.1666],\n",
      "        [ 0.3353],\n",
      "        [ 5.2414],\n",
      "        [-0.0619],\n",
      "        [-1.9904],\n",
      "        [ 0.3052],\n",
      "        [11.1056],\n",
      "        [ 2.4614],\n",
      "        [ 1.9377],\n",
      "        [ 2.1781]])\n",
      "tensor([[ 0.3031, -1.0580],\n",
      "        [ 0.7387,  0.3294],\n",
      "        [ 0.1790, -0.9337],\n",
      "        [-0.4705, -2.6095],\n",
      "        [ 0.7238,  0.1906],\n",
      "        [-1.7840,  1.0659],\n",
      "        [ 0.8718, -1.7213],\n",
      "        [-0.4467, -0.7971],\n",
      "        [ 2.2333,  2.0602],\n",
      "        [-1.6966, -0.3241]]) tensor([[ 8.3946],\n",
      "        [ 4.5616],\n",
      "        [ 7.7291],\n",
      "        [12.1225],\n",
      "        [ 4.9956],\n",
      "        [-2.9882],\n",
      "        [11.7863],\n",
      "        [ 6.0232],\n",
      "        [ 1.6596],\n",
      "        [ 1.9090]])\n",
      "tensor([[ 0.1407,  0.7969],\n",
      "        [-1.2518, -1.2899],\n",
      "        [-0.2136, -0.6597],\n",
      "        [ 0.5932,  1.0463],\n",
      "        [-0.2742, -0.0500],\n",
      "        [-1.1857,  0.1347],\n",
      "        [-0.5766,  0.8305],\n",
      "        [ 0.6344, -0.5603],\n",
      "        [-0.8191,  0.6838],\n",
      "        [ 0.5327, -0.6040]]) tensor([[1.7784],\n",
      "        [6.0906],\n",
      "        [6.0215],\n",
      "        [1.8325],\n",
      "        [3.8062],\n",
      "        [1.3813],\n",
      "        [0.2262],\n",
      "        [7.3783],\n",
      "        [0.2283],\n",
      "        [7.3354]])\n",
      "tensor([[ 1.7478, -0.0909],\n",
      "        [ 0.6181, -0.1797],\n",
      "        [-0.9839,  0.1625],\n",
      "        [ 0.5314,  0.0413],\n",
      "        [ 0.0947,  1.2751],\n",
      "        [ 2.4657,  0.2759],\n",
      "        [-0.4121, -0.2110],\n",
      "        [-0.3635, -0.4256],\n",
      "        [ 0.6375, -0.2105],\n",
      "        [-0.0199,  0.2312]]) tensor([[8.0224],\n",
      "        [6.0554],\n",
      "        [1.6668],\n",
      "        [5.1218],\n",
      "        [0.0543],\n",
      "        [8.1939],\n",
      "        [4.0990],\n",
      "        [4.9217],\n",
      "        [6.1827],\n",
      "        [3.3660]])\n",
      "tensor([[ 1.4317, -0.5083],\n",
      "        [ 0.9492,  0.2332],\n",
      "        [-0.2216,  0.2154],\n",
      "        [-2.0350,  0.3856],\n",
      "        [ 0.4213,  1.4234],\n",
      "        [ 1.2230,  1.9258],\n",
      "        [-0.1169,  1.2235],\n",
      "        [-0.1098, -1.5087],\n",
      "        [-1.3402, -0.1120],\n",
      "        [-0.7082,  1.0543]]) tensor([[ 8.7951],\n",
      "        [ 5.3144],\n",
      "        [ 3.0256],\n",
      "        [-1.1867],\n",
      "        [ 0.2015],\n",
      "        [ 0.1161],\n",
      "        [-0.2056],\n",
      "        [ 9.1159],\n",
      "        [ 1.8973],\n",
      "        [-0.7970]])\n",
      "tensor([[-0.6208, -1.0249],\n",
      "        [-0.4884,  0.9864],\n",
      "        [-2.4609,  0.4532],\n",
      "        [ 0.5021,  0.3713],\n",
      "        [-0.2301,  1.5876],\n",
      "        [-0.1077, -0.9360],\n",
      "        [-1.1872,  0.1519],\n",
      "        [ 0.8928,  0.1275],\n",
      "        [ 0.7266,  0.1826],\n",
      "        [ 1.0727, -2.1134]]) tensor([[ 6.4417],\n",
      "        [-0.1192],\n",
      "        [-2.2482],\n",
      "        [ 3.9211],\n",
      "        [-1.6672],\n",
      "        [ 7.1516],\n",
      "        [ 1.3205],\n",
      "        [ 5.5434],\n",
      "        [ 5.0386],\n",
      "        [13.5336]])\n",
      "tensor([[-0.8820,  0.1665],\n",
      "        [-0.6097,  1.6721],\n",
      "        [ 0.5681, -0.1761],\n",
      "        [-1.0887,  0.7600],\n",
      "        [-0.3101,  1.9433],\n",
      "        [ 0.5710,  0.6367],\n",
      "        [ 0.3957, -2.7981],\n",
      "        [-0.8715,  0.1865],\n",
      "        [-1.4282,  0.1516],\n",
      "        [ 1.7520, -0.5335]]) tensor([[ 1.8473],\n",
      "        [-2.7015],\n",
      "        [ 5.9312],\n",
      "        [-0.5596],\n",
      "        [-3.0371],\n",
      "        [ 3.1968],\n",
      "        [14.5061],\n",
      "        [ 1.8212],\n",
      "        [ 0.8336],\n",
      "        [ 9.5285]])\n",
      "tensor([[ 1.4668,  1.2991],\n",
      "        [-0.3655, -1.5329],\n",
      "        [-2.1170,  1.1356],\n",
      "        [-1.5675,  0.4162],\n",
      "        [-1.0471,  0.1925],\n",
      "        [-0.3269, -1.0486],\n",
      "        [-0.4416,  0.5027],\n",
      "        [-0.0210, -0.1876],\n",
      "        [-0.7949,  0.4889],\n",
      "        [-0.5844,  2.5179]]) tensor([[ 2.7149],\n",
      "        [ 8.6954],\n",
      "        [-3.9072],\n",
      "        [-0.3502],\n",
      "        [ 1.4467],\n",
      "        [ 7.1141],\n",
      "        [ 1.6100],\n",
      "        [ 4.7983],\n",
      "        [ 0.9337],\n",
      "        [-5.5342]])\n",
      "tensor([[-0.6076, -1.2901],\n",
      "        [ 1.1375, -0.7807],\n",
      "        [-0.9001,  0.7937],\n",
      "        [-2.2546, -1.2122],\n",
      "        [ 0.6875, -0.9684],\n",
      "        [ 0.0505, -0.9622],\n",
      "        [-0.5442, -0.6774],\n",
      "        [ 1.9340, -0.5875],\n",
      "        [ 0.5115, -1.0415],\n",
      "        [-0.6844, -1.1045]]) tensor([[ 7.3579],\n",
      "        [ 9.1199],\n",
      "        [-0.2868],\n",
      "        [ 3.8126],\n",
      "        [ 8.8572],\n",
      "        [ 7.5789],\n",
      "        [ 5.4093],\n",
      "        [10.0732],\n",
      "        [ 8.7432],\n",
      "        [ 6.5883]])\n",
      "tensor([[ 0.2330,  0.5568],\n",
      "        [-0.6418, -0.7971],\n",
      "        [-0.5028, -0.3045],\n",
      "        [-0.1327, -0.3099],\n",
      "        [-0.9449, -1.7340],\n",
      "        [-0.1429, -1.0263],\n",
      "        [-0.2022,  0.3884],\n",
      "        [-0.3611,  1.0032],\n",
      "        [-0.1290, -0.7258],\n",
      "        [ 1.6136, -0.4057]]) tensor([[2.7757],\n",
      "        [5.6273],\n",
      "        [4.2153],\n",
      "        [4.9866],\n",
      "        [8.1977],\n",
      "        [7.4216],\n",
      "        [2.4806],\n",
      "        [0.0552],\n",
      "        [6.4146],\n",
      "        [8.8089]])\n",
      "tensor([[-0.4512,  1.3902],\n",
      "        [-1.0005,  1.6316],\n",
      "        [ 0.3101,  1.1873],\n",
      "        [ 0.2287,  0.8274],\n",
      "        [-0.0346,  0.9055],\n",
      "        [ 0.4802,  1.0796],\n",
      "        [-2.1020, -0.2585],\n",
      "        [ 0.0950,  1.0386],\n",
      "        [-0.4979,  1.1339],\n",
      "        [-1.1148,  0.5217]]) tensor([[-1.4254],\n",
      "        [-3.3578],\n",
      "        [ 0.8032],\n",
      "        [ 1.8520],\n",
      "        [ 1.0534],\n",
      "        [ 1.4784],\n",
      "        [ 0.8621],\n",
      "        [ 0.8518],\n",
      "        [-0.6557],\n",
      "        [ 0.1926]])\n",
      "tensor([[ 0.9333, -0.8468],\n",
      "        [ 1.5638, -1.7633],\n",
      "        [-0.2618,  0.0924],\n",
      "        [ 0.6627, -0.9555],\n",
      "        [ 0.5667,  0.1047],\n",
      "        [-1.5824,  0.5788],\n",
      "        [-0.3886, -1.5884],\n",
      "        [-0.3761, -1.9318],\n",
      "        [ 0.7390, -0.2917],\n",
      "        [-0.1501,  1.2543]]) tensor([[ 8.9438],\n",
      "        [13.3286],\n",
      "        [ 3.3673],\n",
      "        [ 8.7462],\n",
      "        [ 4.9736],\n",
      "        [-0.9263],\n",
      "        [ 8.8345],\n",
      "        [ 9.9953],\n",
      "        [ 6.6640],\n",
      "        [-0.3558]])\n",
      "tensor([[-0.1189,  0.6193],\n",
      "        [-0.6893, -0.0251],\n",
      "        [ 1.0021,  0.4782],\n",
      "        [ 0.5903, -1.3019],\n",
      "        [ 0.5256,  2.2577],\n",
      "        [ 0.9885,  0.2652],\n",
      "        [-1.6331,  1.0761],\n",
      "        [-0.1626, -0.1180],\n",
      "        [ 0.6074,  0.0882],\n",
      "        [ 1.0735, -0.5554]]) tensor([[ 1.8415],\n",
      "        [ 2.8957],\n",
      "        [ 4.5603],\n",
      "        [ 9.8004],\n",
      "        [-2.4262],\n",
      "        [ 5.2682],\n",
      "        [-2.7294],\n",
      "        [ 4.2701],\n",
      "        [ 5.1102],\n",
      "        [ 8.2382]])\n",
      "tensor([[ 0.3584, -0.4868],\n",
      "        [ 1.1086, -0.8929],\n",
      "        [ 0.4217,  1.1100],\n",
      "        [-2.5972, -0.9496],\n",
      "        [ 0.7363, -0.5155],\n",
      "        [-0.9880, -0.9027],\n",
      "        [-1.9663,  1.6398],\n",
      "        [-2.0814,  0.9396],\n",
      "        [ 0.1810,  1.0686],\n",
      "        [ 0.9033, -1.4588]]) tensor([[ 6.5734],\n",
      "        [ 9.4660],\n",
      "        [ 1.2725],\n",
      "        [ 2.2336],\n",
      "        [ 7.4345],\n",
      "        [ 5.2791],\n",
      "        [-5.2970],\n",
      "        [-3.1634],\n",
      "        [ 0.9432],\n",
      "        [10.9508]])\n",
      "tensor([[-0.5361, -0.9487],\n",
      "        [-1.0774, -0.0354],\n",
      "        [ 0.2063,  0.4348],\n",
      "        [-0.2157,  0.9371],\n",
      "        [-0.6710, -0.4133],\n",
      "        [ 0.2022,  1.3313],\n",
      "        [ 0.9303, -0.3730],\n",
      "        [-0.7600,  1.3205],\n",
      "        [-1.2695, -0.2602],\n",
      "        [-1.0595,  0.4591]]) tensor([[ 6.3535],\n",
      "        [ 2.1753],\n",
      "        [ 3.1330],\n",
      "        [ 0.5774],\n",
      "        [ 4.2581],\n",
      "        [ 0.0915],\n",
      "        [ 7.3406],\n",
      "        [-1.8261],\n",
      "        [ 2.5579],\n",
      "        [ 0.5166]])\n",
      "tensor([[ 0.2880, -1.9470],\n",
      "        [ 0.0050,  1.7971],\n",
      "        [-0.3360, -2.4247],\n",
      "        [-0.8473,  1.0255],\n",
      "        [ 1.3149,  1.3654],\n",
      "        [-0.5076,  0.3714],\n",
      "        [ 0.0537, -0.5590],\n",
      "        [ 0.1898, -1.2007],\n",
      "        [-1.5169, -1.5973],\n",
      "        [ 0.7772, -0.8463]]) tensor([[11.3935],\n",
      "        [-1.8958],\n",
      "        [11.7673],\n",
      "        [-0.9811],\n",
      "        [ 2.1952],\n",
      "        [ 1.9083],\n",
      "        [ 6.1948],\n",
      "        [ 8.6721],\n",
      "        [ 6.6025],\n",
      "        [ 8.6310]])\n",
      "tensor([[ 1.2300, -0.7463],\n",
      "        [ 0.2365, -0.9690],\n",
      "        [ 0.0243, -0.2496],\n",
      "        [-0.1280, -2.0710],\n",
      "        [ 1.4969, -0.0860],\n",
      "        [ 1.4803,  1.2991],\n",
      "        [-1.3497,  0.1624],\n",
      "        [-0.5171,  0.2560],\n",
      "        [ 0.8207, -0.5128],\n",
      "        [ 0.2623,  3.1351]]) tensor([[ 9.2019],\n",
      "        [ 7.9483],\n",
      "        [ 5.1232],\n",
      "        [10.9834],\n",
      "        [ 7.4760],\n",
      "        [ 2.7514],\n",
      "        [ 0.9475],\n",
      "        [ 2.3094],\n",
      "        [ 7.5891],\n",
      "        [-5.9353]])\n",
      "tensor([[-1.1483,  1.1537],\n",
      "        [ 0.2773,  0.2558],\n",
      "        [-0.3380,  0.5386],\n",
      "        [ 0.6631,  0.0847],\n",
      "        [-0.6716, -0.4476],\n",
      "        [-1.1022,  1.0103],\n",
      "        [-0.5439, -0.5383],\n",
      "        [ 0.4221,  1.1541],\n",
      "        [-0.1827,  0.5260],\n",
      "        [ 0.7939,  1.2597]]) tensor([[-2.0125],\n",
      "        [ 3.8829],\n",
      "        [ 1.6991],\n",
      "        [ 5.2494],\n",
      "        [ 4.3813],\n",
      "        [-1.4317],\n",
      "        [ 4.9543],\n",
      "        [ 1.1191],\n",
      "        [ 2.0385],\n",
      "        [ 1.4920]])\n",
      "tensor([[-1.4133, -0.2919],\n",
      "        [ 0.1063, -0.3459],\n",
      "        [ 0.0743, -0.4669],\n",
      "        [ 1.0442,  1.3497],\n",
      "        [-1.6097, -0.4545],\n",
      "        [ 0.9401,  0.7777],\n",
      "        [ 2.3509, -0.1933],\n",
      "        [-0.1338, -1.0424],\n",
      "        [-0.1206, -0.0716],\n",
      "        [-1.8786,  0.0215]]) tensor([[2.3569],\n",
      "        [5.5919],\n",
      "        [5.9205],\n",
      "        [1.7057],\n",
      "        [2.5056],\n",
      "        [3.4315],\n",
      "        [9.5628],\n",
      "        [7.4716],\n",
      "        [4.2120],\n",
      "        [0.3678]])\n",
      "tensor([[-0.4270, -0.4446],\n",
      "        [-1.4747,  1.9195],\n",
      "        [-0.1135,  0.2162],\n",
      "        [-0.8383,  1.7108],\n",
      "        [-0.3740, -0.0218],\n",
      "        [-0.2322, -0.2512],\n",
      "        [-0.6358,  0.5553],\n",
      "        [ 0.3960, -0.1867],\n",
      "        [ 1.4900,  0.3157],\n",
      "        [ 1.1170,  1.4153]]) tensor([[ 4.8525],\n",
      "        [-5.2820],\n",
      "        [ 3.2286],\n",
      "        [-3.3094],\n",
      "        [ 3.5120],\n",
      "        [ 4.6053],\n",
      "        [ 1.0337],\n",
      "        [ 5.6460],\n",
      "        [ 6.0880],\n",
      "        [ 1.6238]])\n",
      "tensor([[-0.8546,  1.2923],\n",
      "        [-1.8870, -2.0538],\n",
      "        [ 0.0951, -0.4556],\n",
      "        [-1.7361, -0.4882],\n",
      "        [ 2.6633,  0.6631],\n",
      "        [ 0.4826,  1.6148],\n",
      "        [ 0.5959, -0.1102],\n",
      "        [-0.6059, -0.4283],\n",
      "        [ 0.3471, -2.0091],\n",
      "        [-0.6217,  0.8787]]) tensor([[-1.9049],\n",
      "        [ 7.4135],\n",
      "        [ 5.9201],\n",
      "        [ 2.4023],\n",
      "        [ 7.2714],\n",
      "        [-0.3292],\n",
      "        [ 5.7817],\n",
      "        [ 4.4541],\n",
      "        [11.6958],\n",
      "        [-0.0293]])\n",
      "tensor([[ 0.6540,  0.3649],\n",
      "        [-0.5013, -0.2483],\n",
      "        [ 1.3165,  0.3695],\n",
      "        [ 0.0967, -0.8267],\n",
      "        [ 0.6719, -0.3736],\n",
      "        [-0.5977, -0.1438],\n",
      "        [ 0.2274, -0.0530],\n",
      "        [-1.0117, -0.0563],\n",
      "        [ 0.9559, -1.7670],\n",
      "        [ 0.6516, -0.9740]]) tensor([[ 4.2842],\n",
      "        [ 4.0354],\n",
      "        [ 5.5744],\n",
      "        [ 7.2073],\n",
      "        [ 6.8039],\n",
      "        [ 3.4910],\n",
      "        [ 4.8319],\n",
      "        [ 2.3850],\n",
      "        [12.1245],\n",
      "        [ 8.8053]])\n",
      "tensor([[-0.9390,  1.3089],\n",
      "        [-0.4785,  1.1459],\n",
      "        [ 0.9914, -1.6885],\n",
      "        [ 0.2775, -0.0249],\n",
      "        [-0.2010, -0.1354],\n",
      "        [ 0.5939, -1.1601],\n",
      "        [-1.3953,  1.2973],\n",
      "        [-0.3564, -0.2459],\n",
      "        [-0.1075, -1.0763],\n",
      "        [-1.4750,  1.6169]]) tensor([[-2.1347],\n",
      "        [-0.6612],\n",
      "        [11.9274],\n",
      "        [ 4.8288],\n",
      "        [ 4.2552],\n",
      "        [ 9.3248],\n",
      "        [-2.9883],\n",
      "        [ 4.3191],\n",
      "        [ 7.6322],\n",
      "        [-4.2465]])\n",
      "tensor([[-0.8654,  0.4924],\n",
      "        [-0.5128,  1.8214],\n",
      "        [-0.1145,  1.7416],\n",
      "        [ 0.2148, -0.5835],\n",
      "        [-0.6444, -0.9027],\n",
      "        [ 0.0214, -0.0847],\n",
      "        [ 0.7823,  0.3104],\n",
      "        [ 0.4664,  1.9626],\n",
      "        [ 0.4281, -1.7382],\n",
      "        [-0.3609,  0.5712]]) tensor([[ 0.7826],\n",
      "        [-3.0147],\n",
      "        [-1.9362],\n",
      "        [ 6.6214],\n",
      "        [ 5.9655],\n",
      "        [ 4.5434],\n",
      "        [ 4.7077],\n",
      "        [-1.5432],\n",
      "        [10.9558],\n",
      "        [ 1.5352]])\n",
      "tensor([[-0.0303, -1.5691],\n",
      "        [ 2.0543, -1.3096],\n",
      "        [-1.3404, -0.4866],\n",
      "        [ 0.9260,  0.7509],\n",
      "        [-0.9420, -0.4459],\n",
      "        [-0.8339,  1.0970],\n",
      "        [ 0.4185,  1.2543],\n",
      "        [ 1.2651,  1.4941],\n",
      "        [ 0.5507,  0.4885],\n",
      "        [-2.1181,  0.9715]]) tensor([[ 9.4801],\n",
      "        [12.7578],\n",
      "        [ 3.1660],\n",
      "        [ 3.5009],\n",
      "        [ 3.8400],\n",
      "        [-1.1844],\n",
      "        [ 0.7583],\n",
      "        [ 1.6455],\n",
      "        [ 3.6300],\n",
      "        [-3.3517]])\n",
      "tensor([[-0.1506,  0.5578],\n",
      "        [ 0.6549, -0.2975],\n",
      "        [ 0.1558,  1.9479],\n",
      "        [ 2.3150,  1.3484],\n",
      "        [ 0.2616,  1.4461],\n",
      "        [-0.8810,  0.7008],\n",
      "        [-0.4807,  0.7187],\n",
      "        [ 0.4303, -1.6456],\n",
      "        [ 0.0942, -0.5215],\n",
      "        [ 0.5771, -1.8091]]) tensor([[ 2.0015],\n",
      "        [ 6.5348],\n",
      "        [-2.1235],\n",
      "        [ 4.2323],\n",
      "        [-0.1899],\n",
      "        [ 0.0607],\n",
      "        [ 0.8144],\n",
      "        [10.6617],\n",
      "        [ 6.1647],\n",
      "        [11.5085]])\n",
      "tensor([[ 1.1004, -0.9771],\n",
      "        [-0.7213,  1.8952],\n",
      "        [ 1.1578, -1.0657],\n",
      "        [ 0.8567, -1.2933],\n",
      "        [ 2.3953,  1.7038],\n",
      "        [ 0.5976, -0.4108],\n",
      "        [-0.9557, -0.7870],\n",
      "        [ 1.4547, -0.0678],\n",
      "        [-0.4559, -0.0573],\n",
      "        [ 0.3866, -1.7511]]) tensor([[ 9.7248],\n",
      "        [-3.6779],\n",
      "        [10.1524],\n",
      "        [10.3034],\n",
      "        [ 3.2011],\n",
      "        [ 6.7925],\n",
      "        [ 4.9766],\n",
      "        [ 7.3217],\n",
      "        [ 3.4810],\n",
      "        [10.9245]])\n",
      "tensor([[-0.1114, -0.7230],\n",
      "        [-0.2796,  0.0776],\n",
      "        [-1.1508, -0.1936],\n",
      "        [-0.4599,  2.6070],\n",
      "        [ 0.4078,  0.0697],\n",
      "        [ 0.6007,  1.0087],\n",
      "        [-0.8202, -2.0154],\n",
      "        [-0.0627,  1.1846],\n",
      "        [ 0.3130, -0.9917],\n",
      "        [ 0.1243, -1.3337]]) tensor([[ 6.4393],\n",
      "        [ 3.3730],\n",
      "        [ 2.5346],\n",
      "        [-5.5805],\n",
      "        [ 4.7872],\n",
      "        [ 1.9741],\n",
      "        [ 9.4092],\n",
      "        [ 0.0283],\n",
      "        [ 8.1674],\n",
      "        [ 8.9921]])\n",
      "tensor([[ 1.4320,  0.3405],\n",
      "        [ 0.5706, -0.0080],\n",
      "        [-0.4767,  0.2704],\n",
      "        [ 1.0037,  0.2260],\n",
      "        [-0.9861, -1.2528],\n",
      "        [ 0.0992, -0.4465],\n",
      "        [-0.7768,  1.5773],\n",
      "        [-0.2952, -0.0723],\n",
      "        [ 0.0865,  0.6259],\n",
      "        [ 0.8417,  0.6110]]) tensor([[ 5.9248],\n",
      "        [ 5.3518],\n",
      "        [ 2.3199],\n",
      "        [ 5.4417],\n",
      "        [ 6.4809],\n",
      "        [ 5.8910],\n",
      "        [-2.7192],\n",
      "        [ 3.8705],\n",
      "        [ 2.2639],\n",
      "        [ 3.7950]])\n",
      "tensor([[ 1.5115,  0.1237],\n",
      "        [ 1.6893,  3.6381],\n",
      "        [ 0.9920, -0.5735],\n",
      "        [-1.0908,  1.6275],\n",
      "        [-0.6566,  0.7027],\n",
      "        [-0.5378, -0.1843],\n",
      "        [ 1.2571,  0.4680],\n",
      "        [ 1.6138, -1.2130],\n",
      "        [-1.3121,  0.2840],\n",
      "        [-0.4154, -0.9380]]) tensor([[ 6.8141],\n",
      "        [-4.7850],\n",
      "        [ 8.1282],\n",
      "        [-3.5139],\n",
      "        [ 0.5027],\n",
      "        [ 3.7647],\n",
      "        [ 5.1217],\n",
      "        [11.5540],\n",
      "        [ 0.6237],\n",
      "        [ 6.5503]])\n",
      "tensor([[-1.1613, -0.3267],\n",
      "        [-0.4313,  0.0801],\n",
      "        [ 0.2554,  0.8438],\n",
      "        [-0.9237, -0.6884],\n",
      "        [ 0.0694,  1.0950],\n",
      "        [ 0.3727,  0.4051],\n",
      "        [-1.1296,  0.4075],\n",
      "        [ 1.7434, -0.9436],\n",
      "        [ 0.3522,  1.7215],\n",
      "        [-1.2184,  0.4965]]) tensor([[ 2.9909],\n",
      "        [ 3.0633],\n",
      "        [ 1.8363],\n",
      "        [ 4.6854],\n",
      "        [ 0.5949],\n",
      "        [ 3.5717],\n",
      "        [ 0.5684],\n",
      "        [10.9087],\n",
      "        [-0.9391],\n",
      "        [ 0.0740]])\n",
      "tensor([[-1.8756,  1.6686],\n",
      "        [-1.3185, -0.4197],\n",
      "        [ 0.4067, -0.4502],\n",
      "        [ 1.2054,  0.4454],\n",
      "        [ 2.4511, -0.4452],\n",
      "        [-0.3066,  1.2469],\n",
      "        [-0.6583,  0.7114],\n",
      "        [ 0.4866, -1.6194],\n",
      "        [ 0.8734, -0.7313],\n",
      "        [ 0.4284,  0.2688]]) tensor([[-5.2362],\n",
      "        [ 2.9738],\n",
      "        [ 6.5498],\n",
      "        [ 5.0957],\n",
      "        [10.6158],\n",
      "        [-0.6316],\n",
      "        [ 0.4575],\n",
      "        [10.6790],\n",
      "        [ 8.4282],\n",
      "        [ 4.1249]])\n",
      "tensor([[ 0.3913, -0.2990],\n",
      "        [-0.0963,  1.5454],\n",
      "        [ 0.7438,  0.4220],\n",
      "        [ 0.0911, -0.4332],\n",
      "        [ 0.3558, -1.6768],\n",
      "        [ 0.0043,  0.5466],\n",
      "        [ 0.5276, -0.3976],\n",
      "        [ 0.7785,  0.0651],\n",
      "        [-0.9529,  0.4201],\n",
      "        [-0.9147,  0.3595]]) tensor([[ 5.9924],\n",
      "        [-1.2555],\n",
      "        [ 4.2684],\n",
      "        [ 5.8507],\n",
      "        [10.6025],\n",
      "        [ 2.3586],\n",
      "        [ 6.6198],\n",
      "        [ 5.5398],\n",
      "        [ 0.8747],\n",
      "        [ 1.1440]])\n",
      "tensor([[-0.9991,  1.8152],\n",
      "        [-0.1023,  0.6473],\n",
      "        [-0.5831,  0.3631],\n",
      "        [ 1.6824, -1.6470],\n",
      "        [-1.1414,  0.0305],\n",
      "        [-0.5385,  0.1197],\n",
      "        [ 0.7080, -0.8032],\n",
      "        [-0.3086,  0.2438],\n",
      "        [-0.2476, -0.6719],\n",
      "        [-0.6633, -1.0454]]) tensor([[-3.9733],\n",
      "        [ 1.7930],\n",
      "        [ 1.7938],\n",
      "        [13.1447],\n",
      "        [ 1.8134],\n",
      "        [ 2.7115],\n",
      "        [ 8.3648],\n",
      "        [ 2.7649],\n",
      "        [ 5.9942],\n",
      "        [ 6.4212]])\n",
      "tensor([[ 1.2217,  0.8043],\n",
      "        [-1.1308,  1.6066],\n",
      "        [-1.3950,  0.0593],\n",
      "        [ 0.2210, -0.4628],\n",
      "        [-0.4546,  0.1202],\n",
      "        [-1.2208,  1.3457],\n",
      "        [ 0.6805, -1.7519],\n",
      "        [-0.1886, -0.4951],\n",
      "        [-1.7168, -1.0456],\n",
      "        [-0.0586, -1.8841]]) tensor([[ 3.9165],\n",
      "        [-3.5078],\n",
      "        [ 1.2053],\n",
      "        [ 6.2147],\n",
      "        [ 2.8557],\n",
      "        [-2.8102],\n",
      "        [11.5289],\n",
      "        [ 5.5071],\n",
      "        [ 4.3279],\n",
      "        [10.4924]])\n",
      "tensor([[-0.3571,  0.8802],\n",
      "        [-0.2105,  0.0396],\n",
      "        [ 0.1038, -0.9619],\n",
      "        [-1.2842, -1.0122],\n",
      "        [ 0.1473,  1.3948],\n",
      "        [ 0.4955,  0.7156],\n",
      "        [-0.4874, -0.8621],\n",
      "        [ 0.2008, -1.1649],\n",
      "        [-1.0812, -0.0398],\n",
      "        [ 0.0303, -1.5063]]) tensor([[ 0.5100],\n",
      "        [ 3.6303],\n",
      "        [ 7.6716],\n",
      "        [ 5.0751],\n",
      "        [-0.2524],\n",
      "        [ 2.7601],\n",
      "        [ 6.1727],\n",
      "        [ 8.5726],\n",
      "        [ 2.1848],\n",
      "        [ 9.3888]])\n",
      "tensor([[-3.9832e-01,  9.4839e-01],\n",
      "        [-4.1618e-01, -4.4049e-01],\n",
      "        [-2.0887e+00,  5.9343e-01],\n",
      "        [-8.1751e-01,  4.0339e-01],\n",
      "        [-1.7686e+00,  3.6628e-01],\n",
      "        [-1.2148e+00, -8.5871e-01],\n",
      "        [-3.8881e-01, -4.7566e-01],\n",
      "        [ 1.1555e+00, -1.8223e-03],\n",
      "        [-7.3384e-01,  4.8909e-01],\n",
      "        [ 1.0296e+00, -1.6692e+00]]) tensor([[ 0.1808],\n",
      "        [ 4.8691],\n",
      "        [-1.9813],\n",
      "        [ 1.1900],\n",
      "        [-0.5941],\n",
      "        [ 4.6963],\n",
      "        [ 5.0504],\n",
      "        [ 6.5164],\n",
      "        [ 1.0849],\n",
      "        [11.9574]])\n",
      "tensor([[ 0.3706, -0.1160],\n",
      "        [-0.2036,  0.4129],\n",
      "        [ 0.3086,  1.5161],\n",
      "        [-0.8479, -0.9555],\n",
      "        [-0.2043,  0.5574],\n",
      "        [-0.1955, -1.1413],\n",
      "        [ 0.3375,  0.2512],\n",
      "        [-0.9773,  0.5047],\n",
      "        [ 1.6307,  0.1246],\n",
      "        [-0.4166, -0.2352]]) tensor([[ 5.3350],\n",
      "        [ 2.3954],\n",
      "        [-0.3443],\n",
      "        [ 5.7502],\n",
      "        [ 1.9016],\n",
      "        [ 7.6966],\n",
      "        [ 4.0252],\n",
      "        [ 0.5212],\n",
      "        [ 7.0297],\n",
      "        [ 4.1712]])\n",
      "tensor([[ 2.4304, -0.7225],\n",
      "        [ 1.5113, -1.2939],\n",
      "        [-0.8586,  0.2466],\n",
      "        [ 1.6726,  0.2705],\n",
      "        [ 0.0445,  0.7364],\n",
      "        [-0.6729,  0.7933],\n",
      "        [ 0.0150,  0.3085],\n",
      "        [-1.4432,  0.4003],\n",
      "        [ 0.1739,  0.3887],\n",
      "        [ 1.4532, -0.0784]]) tensor([[11.5145],\n",
      "        [11.6280],\n",
      "        [ 1.6300],\n",
      "        [ 6.6397],\n",
      "        [ 1.7560],\n",
      "        [ 0.1540],\n",
      "        [ 3.1987],\n",
      "        [-0.0465],\n",
      "        [ 3.2213],\n",
      "        [ 7.3789]])\n",
      "tensor([[ 1.2641,  1.6858],\n",
      "        [-0.1359,  1.1043],\n",
      "        [ 0.6490, -1.7727],\n",
      "        [ 0.3718,  0.7223],\n",
      "        [ 0.5675,  1.5216],\n",
      "        [ 0.3450, -0.9030],\n",
      "        [-0.2200, -1.0983],\n",
      "        [ 1.0221,  0.7813],\n",
      "        [ 0.5982,  0.3874],\n",
      "        [-0.7183, -2.0214]]) tensor([[ 1.0183],\n",
      "        [ 0.1816],\n",
      "        [11.5397],\n",
      "        [ 2.4744],\n",
      "        [ 0.1652],\n",
      "        [ 7.9684],\n",
      "        [ 7.4761],\n",
      "        [ 3.5872],\n",
      "        [ 4.0862],\n",
      "        [ 9.6453]])\n",
      "tensor([[ 0.7785, -0.5535],\n",
      "        [ 0.8919,  0.1957],\n",
      "        [-1.9311,  1.6883],\n",
      "        [ 0.1784, -0.6723],\n",
      "        [-1.3827, -0.1998],\n",
      "        [-2.0837, -0.5767],\n",
      "        [-0.3806,  0.1307],\n",
      "        [ 0.4553, -0.3861],\n",
      "        [-1.8303, -1.0270],\n",
      "        [ 0.5899,  1.3962]]) tensor([[ 7.6546],\n",
      "        [ 5.3240],\n",
      "        [-5.3995],\n",
      "        [ 6.8470],\n",
      "        [ 2.1112],\n",
      "        [ 1.9834],\n",
      "        [ 2.9982],\n",
      "        [ 6.4194],\n",
      "        [ 4.0370],\n",
      "        [ 0.6292]])\n",
      "tensor([[ 0.2336, -2.6564],\n",
      "        [ 0.0175, -0.6187],\n",
      "        [-0.5706, -0.2982],\n",
      "        [-0.1468, -1.1818],\n",
      "        [ 0.4096,  0.9367],\n",
      "        [ 0.2150,  0.9542],\n",
      "        [ 0.7779,  0.0910],\n",
      "        [ 0.4994,  0.3096],\n",
      "        [ 0.6611,  1.9790],\n",
      "        [ 1.7613,  0.2016]]) tensor([[13.7073],\n",
      "        [ 6.3353],\n",
      "        [ 4.0652],\n",
      "        [ 7.9263],\n",
      "        [ 1.8381],\n",
      "        [ 1.3770],\n",
      "        [ 5.4543],\n",
      "        [ 4.1600],\n",
      "        [-1.1973],\n",
      "        [ 7.0268]])\n",
      "tensor([[-1.5231,  0.7324],\n",
      "        [ 0.2634,  0.0460],\n",
      "        [ 0.2266,  0.8397],\n",
      "        [-0.2393, -0.2417],\n",
      "        [-0.7770,  0.5755],\n",
      "        [ 0.1290, -0.9550],\n",
      "        [ 0.1851, -1.0491],\n",
      "        [ 0.8841, -0.2638],\n",
      "        [ 0.8138, -0.1223],\n",
      "        [-0.8272, -0.9210]]) tensor([[-1.3486],\n",
      "        [ 4.5847],\n",
      "        [ 1.7897],\n",
      "        [ 4.5372],\n",
      "        [ 0.6935],\n",
      "        [ 7.7056],\n",
      "        [ 8.1387],\n",
      "        [ 6.8550],\n",
      "        [ 6.2260],\n",
      "        [ 5.6631]])\n",
      "tensor([[ 0.1522,  0.4163],\n",
      "        [ 0.3338, -1.2107],\n",
      "        [ 0.8908, -0.3453],\n",
      "        [-1.8230, -0.6915],\n",
      "        [ 0.3543, -0.1681],\n",
      "        [ 1.2198, -2.1135],\n",
      "        [-0.9237,  0.1265],\n",
      "        [-0.6653, -1.0514],\n",
      "        [-0.3076, -0.6800],\n",
      "        [ 0.6431, -0.3338]]) tensor([[ 3.0674],\n",
      "        [ 8.9981],\n",
      "        [ 7.1653],\n",
      "        [ 2.8819],\n",
      "        [ 5.4661],\n",
      "        [13.8287],\n",
      "        [ 1.9143],\n",
      "        [ 6.4414],\n",
      "        [ 5.8938],\n",
      "        [ 6.6247]])\n",
      "tensor([[ 0.8168, -0.8665],\n",
      "        [ 0.2324,  0.0026],\n",
      "        [ 1.3708,  0.1059],\n",
      "        [-0.0573, -0.5889],\n",
      "        [ 0.1120,  0.1260],\n",
      "        [-0.0983, -0.5009],\n",
      "        [-0.0055,  1.6720],\n",
      "        [-0.1414, -1.1541],\n",
      "        [ 1.0833, -0.1560],\n",
      "        [-1.1655, -0.0460]]) tensor([[ 8.7719],\n",
      "        [ 4.6317],\n",
      "        [ 6.5821],\n",
      "        [ 6.0904],\n",
      "        [ 3.9900],\n",
      "        [ 5.7118],\n",
      "        [-1.4854],\n",
      "        [ 7.8301],\n",
      "        [ 6.8968],\n",
      "        [ 2.0185]])\n",
      "tensor([[ 0.8533,  0.0534],\n",
      "        [-0.8227, -0.4150],\n",
      "        [-0.3251, -0.9312],\n",
      "        [-0.5862,  0.3512],\n",
      "        [-0.1184, -0.2664],\n",
      "        [-0.7721,  0.3019],\n",
      "        [-0.2290,  0.7490],\n",
      "        [ 2.7520,  0.3794],\n",
      "        [-1.2009, -0.0506],\n",
      "        [ 1.1335, -0.2766]]) tensor([[5.7143],\n",
      "        [3.9450],\n",
      "        [6.7232],\n",
      "        [1.8299],\n",
      "        [4.8576],\n",
      "        [1.6314],\n",
      "        [1.1810],\n",
      "        [8.4141],\n",
      "        [1.9684],\n",
      "        [7.3929]])\n",
      "tensor([[ 0.2978, -0.7478],\n",
      "        [-1.7722, -1.1935],\n",
      "        [-0.4142,  1.1251],\n",
      "        [ 0.1084, -0.0951],\n",
      "        [ 0.0688,  0.5452],\n",
      "        [-0.5294, -0.7625],\n",
      "        [-1.5011,  0.6346],\n",
      "        [-0.3724, -0.1417],\n",
      "        [-0.1651, -0.7229],\n",
      "        [ 0.4949,  0.2977]]) tensor([[ 7.3524],\n",
      "        [ 4.7117],\n",
      "        [-0.4602],\n",
      "        [ 4.7689],\n",
      "        [ 2.4718],\n",
      "        [ 5.7368],\n",
      "        [-0.9529],\n",
      "        [ 3.9388],\n",
      "        [ 6.3174],\n",
      "        [ 4.1681]])\n",
      "tensor([[ 1.2084,  2.0882],\n",
      "        [-1.6805, -1.2852],\n",
      "        [ 0.3962, -0.4494],\n",
      "        [-1.2111, -0.2554],\n",
      "        [-0.5118, -0.3660],\n",
      "        [ 0.4419, -0.6516],\n",
      "        [-0.9863, -1.3178],\n",
      "        [ 0.6020, -0.4674],\n",
      "        [-1.0667,  0.6835],\n",
      "        [-0.9455, -0.6495]]) tensor([[-0.4684],\n",
      "        [ 5.2039],\n",
      "        [ 6.5385],\n",
      "        [ 2.6448],\n",
      "        [ 4.4396],\n",
      "        [ 7.2842],\n",
      "        [ 6.7299],\n",
      "        [ 6.9897],\n",
      "        [-0.2577],\n",
      "        [ 4.4957]])\n",
      "tensor([[-0.2319,  1.2210],\n",
      "        [-1.5701,  1.0418],\n",
      "        [ 1.0699, -2.1804],\n",
      "        [-0.3756, -0.6823],\n",
      "        [ 1.2224,  0.3315],\n",
      "        [ 0.4722,  0.5461],\n",
      "        [-1.7722,  1.5756],\n",
      "        [-0.5751,  1.4389],\n",
      "        [-0.1184, -1.1927],\n",
      "        [-0.4912,  0.9826]]) tensor([[-0.4182],\n",
      "        [-2.4897],\n",
      "        [13.7566],\n",
      "        [ 5.7609],\n",
      "        [ 5.5249],\n",
      "        [ 3.3058],\n",
      "        [-4.6898],\n",
      "        [-1.8333],\n",
      "        [ 8.0144],\n",
      "        [-0.1285]])\n",
      "tensor([[ 1.3716, -0.6341],\n",
      "        [ 0.2718,  1.2736],\n",
      "        [ 0.8921,  0.1192],\n",
      "        [-1.3373, -0.3735],\n",
      "        [-0.2933, -1.5333],\n",
      "        [-1.3488, -0.4635],\n",
      "        [ 1.6502,  0.0741],\n",
      "        [-0.0891, -0.9195],\n",
      "        [ 1.7468,  0.5046],\n",
      "        [-0.7582, -0.5318]]) tensor([[9.1025],\n",
      "        [0.4133],\n",
      "        [5.5564],\n",
      "        [2.7962],\n",
      "        [8.8315],\n",
      "        [3.0761],\n",
      "        [7.2462],\n",
      "        [7.1498],\n",
      "        [5.9702],\n",
      "        [4.4975]])\n",
      "tensor([[-0.9253,  1.2481],\n",
      "        [-0.2263,  0.5646],\n",
      "        [-0.6031,  1.0951],\n",
      "        [-0.0052, -0.2996],\n",
      "        [-1.1925, -1.3079],\n",
      "        [ 0.0692, -1.0733],\n",
      "        [ 0.8267,  0.2067],\n",
      "        [ 0.6530, -0.0767],\n",
      "        [-2.5947,  1.5508],\n",
      "        [ 0.6715,  2.9292]]) tensor([[-1.8874],\n",
      "        [ 1.8098],\n",
      "        [-0.7368],\n",
      "        [ 5.1970],\n",
      "        [ 6.2557],\n",
      "        [ 8.0007],\n",
      "        [ 5.1696],\n",
      "        [ 5.7721],\n",
      "        [-6.2529],\n",
      "        [-4.4108]])\n",
      "tensor([[-0.7324,  1.8781],\n",
      "        [ 0.8592, -0.1459],\n",
      "        [-0.9661,  0.0749],\n",
      "        [-0.0937, -1.3631],\n",
      "        [-0.6472,  1.2207],\n",
      "        [-0.2692, -0.1465],\n",
      "        [ 0.3905,  0.9202],\n",
      "        [-0.3455,  1.0600],\n",
      "        [ 0.7675, -1.1751],\n",
      "        [-0.6064, -0.4426]]) tensor([[-3.6688],\n",
      "        [ 6.4157],\n",
      "        [ 2.0254],\n",
      "        [ 8.6490],\n",
      "        [-1.2376],\n",
      "        [ 4.1614],\n",
      "        [ 1.8510],\n",
      "        [-0.1020],\n",
      "        [ 9.7258],\n",
      "        [ 4.4871]])\n",
      "tensor([[ 1.1757,  0.2061],\n",
      "        [-1.3800, -0.3385],\n",
      "        [ 1.1212, -0.0753],\n",
      "        [ 0.1197, -1.6512],\n",
      "        [-1.0911,  2.2801],\n",
      "        [-0.8054,  0.0638],\n",
      "        [ 0.0566,  0.4491],\n",
      "        [-0.7337, -1.2432],\n",
      "        [-1.0508, -0.5986],\n",
      "        [ 0.6866,  0.2341]]) tensor([[ 5.8615],\n",
      "        [ 2.5924],\n",
      "        [ 6.6723],\n",
      "        [10.0408],\n",
      "        [-5.7246],\n",
      "        [ 2.3738],\n",
      "        [ 2.7851],\n",
      "        [ 6.9523],\n",
      "        [ 4.1415],\n",
      "        [ 4.7608]])\n",
      "tensor([[ 5.8410e-01,  1.2332e+00],\n",
      "        [-8.9086e-01,  3.7886e-01],\n",
      "        [-1.3361e+00,  1.6295e-03],\n",
      "        [-1.4379e+00,  1.1766e-01],\n",
      "        [-1.4816e+00,  6.9677e-01],\n",
      "        [ 4.0089e-01,  1.6675e+00],\n",
      "        [-7.5691e-01,  1.1933e-01],\n",
      "        [ 1.8643e+00, -1.1249e-01],\n",
      "        [ 1.2584e+00, -2.2387e-01],\n",
      "        [ 2.1016e-01,  6.7021e-02]]) tensor([[ 1.1813],\n",
      "        [ 1.1318],\n",
      "        [ 1.5145],\n",
      "        [ 0.9331],\n",
      "        [-1.1277],\n",
      "        [-0.6559],\n",
      "        [ 2.2727],\n",
      "        [ 8.3174],\n",
      "        [ 7.4789],\n",
      "        [ 4.3964]])\n",
      "tensor([[-1.2748, -0.7191],\n",
      "        [-0.8558, -2.2045],\n",
      "        [-0.2538, -1.6449],\n",
      "        [ 0.9670, -1.9879],\n",
      "        [ 0.3226, -1.3853],\n",
      "        [ 0.6850,  0.1972],\n",
      "        [-0.1766,  0.5892],\n",
      "        [ 1.7654,  0.5241],\n",
      "        [-1.2860,  2.4491],\n",
      "        [-1.2724,  0.4830]]) tensor([[ 4.0912e+00],\n",
      "        [ 9.9956e+00],\n",
      "        [ 9.2836e+00],\n",
      "        [ 1.2880e+01],\n",
      "        [ 9.5652e+00],\n",
      "        [ 4.8979e+00],\n",
      "        [ 1.8427e+00],\n",
      "        [ 5.9491e+00],\n",
      "        [-6.6936e+00],\n",
      "        [ 9.7353e-03]])\n",
      "tensor([[-1.0576, -0.9325],\n",
      "        [-1.1760,  0.6277],\n",
      "        [-0.5637, -1.2816],\n",
      "        [ 1.1390,  0.8289],\n",
      "        [ 0.3058,  0.1429],\n",
      "        [ 0.4107, -1.4272],\n",
      "        [-0.3566, -0.3034],\n",
      "        [ 1.5969, -0.7174],\n",
      "        [-0.1197,  1.0218],\n",
      "        [ 1.3699, -0.3710]]) tensor([[ 5.2496],\n",
      "        [-0.2735],\n",
      "        [ 7.4372],\n",
      "        [ 3.6409],\n",
      "        [ 4.3319],\n",
      "        [ 9.8778],\n",
      "        [ 4.5277],\n",
      "        [ 9.8129],\n",
      "        [ 0.4874],\n",
      "        [ 8.1991]])\n",
      "tensor([[-1.2290,  0.1932],\n",
      "        [ 2.8399, -0.6117],\n",
      "        [-1.4481, -0.3164],\n",
      "        [ 1.2957, -1.7175],\n",
      "        [ 1.2713,  0.8361],\n",
      "        [ 0.3902,  0.6507],\n",
      "        [ 0.6634,  1.3319],\n",
      "        [ 0.1630,  1.1168],\n",
      "        [-0.8663, -0.8882],\n",
      "        [ 0.2985,  0.0671]]) tensor([[ 1.1096],\n",
      "        [11.9488],\n",
      "        [ 2.3841],\n",
      "        [12.6302],\n",
      "        [ 3.8881],\n",
      "        [ 2.7671],\n",
      "        [ 0.9944],\n",
      "        [ 0.7393],\n",
      "        [ 5.4957],\n",
      "        [ 4.5653]])\n",
      "tensor([[ 1.7828, -1.0545],\n",
      "        [-0.1933,  0.3895],\n",
      "        [ 1.7740, -0.3797],\n",
      "        [-1.8282, -0.4513],\n",
      "        [ 1.2435, -0.9363],\n",
      "        [-1.0062,  1.9861],\n",
      "        [-1.9884,  0.2561],\n",
      "        [ 0.2840, -0.6203],\n",
      "        [-1.0252,  0.6679],\n",
      "        [ 1.8282, -1.0874]]) tensor([[11.3570],\n",
      "        [ 2.4847],\n",
      "        [ 9.0471],\n",
      "        [ 2.0538],\n",
      "        [ 9.8685],\n",
      "        [-4.5622],\n",
      "        [-0.6384],\n",
      "        [ 6.8801],\n",
      "        [-0.1419],\n",
      "        [11.5541]])\n",
      "tensor([[ 1.9892, -3.2920],\n",
      "        [ 0.3407, -0.4550],\n",
      "        [ 0.4785,  2.4225],\n",
      "        [-0.0086, -1.4016],\n",
      "        [-0.3987, -0.7724],\n",
      "        [-0.1027,  0.3837],\n",
      "        [ 0.1810, -0.0836],\n",
      "        [ 0.7061,  1.6692],\n",
      "        [-1.0068,  0.0227],\n",
      "        [-0.1273,  0.6566]]) tensor([[19.3655],\n",
      "        [ 6.4217],\n",
      "        [-3.0519],\n",
      "        [ 8.9417],\n",
      "        [ 6.0306],\n",
      "        [ 2.6991],\n",
      "        [ 4.8420],\n",
      "        [-0.0764],\n",
      "        [ 2.0990],\n",
      "        [ 1.7051]])\n",
      "tensor([[ 1.8590,  2.1728],\n",
      "        [ 0.0364, -0.6162],\n",
      "        [-1.0534,  0.2426],\n",
      "        [-1.4399,  1.2539],\n",
      "        [ 0.2852,  0.2240],\n",
      "        [-0.2969,  0.6444],\n",
      "        [ 1.0368,  0.0722],\n",
      "        [ 0.4621,  1.1934],\n",
      "        [-0.8189, -0.6244],\n",
      "        [ 1.3861,  0.9392]]) tensor([[ 0.5605],\n",
      "        [ 6.3714],\n",
      "        [ 1.2753],\n",
      "        [-2.9488],\n",
      "        [ 4.0065],\n",
      "        [ 1.4132],\n",
      "        [ 6.0475],\n",
      "        [ 1.0689],\n",
      "        [ 4.6885],\n",
      "        [ 3.7703]])\n",
      "tensor([[ 1.3711, -0.6457],\n",
      "        [ 1.3400, -0.9960],\n",
      "        [ 0.4676,  0.8770],\n",
      "        [-1.3481, -0.3902],\n",
      "        [ 1.1703,  1.1314],\n",
      "        [ 0.1264,  0.9126],\n",
      "        [-0.1716, -0.3147],\n",
      "        [-0.3043,  0.3224],\n",
      "        [ 0.6918,  1.0302],\n",
      "        [ 1.6383, -0.6296]]) tensor([[ 9.1483],\n",
      "        [10.2729],\n",
      "        [ 2.1688],\n",
      "        [ 2.8045],\n",
      "        [ 2.6894],\n",
      "        [ 1.3431],\n",
      "        [ 4.9235],\n",
      "        [ 2.4802],\n",
      "        [ 2.0995],\n",
      "        [ 9.6212]])\n",
      "tensor([[-0.8981,  0.9989],\n",
      "        [ 0.9288, -0.5533],\n",
      "        [ 0.8557,  0.1504],\n",
      "        [ 1.7777,  0.9816],\n",
      "        [ 0.6526, -0.3949],\n",
      "        [-0.4602, -0.4939],\n",
      "        [-1.1934, -0.7999],\n",
      "        [ 1.5488, -1.7439],\n",
      "        [-1.7884, -0.5017],\n",
      "        [ 0.7080,  2.4186]]) tensor([[-0.9727],\n",
      "        [ 7.9360],\n",
      "        [ 5.3872],\n",
      "        [ 4.4220],\n",
      "        [ 6.8535],\n",
      "        [ 4.9716],\n",
      "        [ 4.5384],\n",
      "        [13.2354],\n",
      "        [ 2.3239],\n",
      "        [-2.6150]])\n",
      "tensor([[ 0.9836,  1.5927],\n",
      "        [ 0.9910,  1.0773],\n",
      "        [-0.9753, -0.9298],\n",
      "        [ 0.1826,  1.7421],\n",
      "        [-0.4376,  0.0108],\n",
      "        [-0.9025,  0.0746],\n",
      "        [ 1.4910, -0.8262],\n",
      "        [-0.9693,  2.0883],\n",
      "        [ 0.4282,  0.2993],\n",
      "        [-0.1801,  0.8016]]) tensor([[ 0.7507],\n",
      "        [ 2.5275],\n",
      "        [ 5.4088],\n",
      "        [-1.3582],\n",
      "        [ 3.2879],\n",
      "        [ 2.1357],\n",
      "        [ 9.9937],\n",
      "        [-4.8524],\n",
      "        [ 4.0471],\n",
      "        [ 1.1228]])\n",
      "tensor([[-0.0457,  1.4645],\n",
      "        [ 0.4077, -1.0368],\n",
      "        [-0.5619,  1.6239],\n",
      "        [-0.8097, -0.9064],\n",
      "        [ 0.3096, -0.4515],\n",
      "        [ 0.1507,  0.2088],\n",
      "        [ 1.4700,  0.2936],\n",
      "        [-0.3221, -0.7563],\n",
      "        [ 2.0251,  0.6582],\n",
      "        [ 0.6196, -0.0085]]) tensor([[-0.8601],\n",
      "        [ 8.5402],\n",
      "        [-2.4657],\n",
      "        [ 5.6655],\n",
      "        [ 6.3418],\n",
      "        [ 3.7794],\n",
      "        [ 6.1493],\n",
      "        [ 6.1191],\n",
      "        [ 6.0012],\n",
      "        [ 5.4617]])\n",
      "tensor([[ 1.0390, -0.0440],\n",
      "        [ 0.7668,  0.1468],\n",
      "        [ 1.3084, -1.0837],\n",
      "        [ 1.0128, -1.5621],\n",
      "        [ 0.0300, -0.5660],\n",
      "        [ 0.6805, -2.1683],\n",
      "        [ 1.3695,  0.6559],\n",
      "        [ 1.1160,  0.8467],\n",
      "        [ 1.3900,  0.3799],\n",
      "        [ 1.2116,  0.1061]]) tensor([[ 6.4280],\n",
      "        [ 5.2457],\n",
      "        [10.5090],\n",
      "        [11.5397],\n",
      "        [ 6.1870],\n",
      "        [12.9469],\n",
      "        [ 4.7064],\n",
      "        [ 3.5611],\n",
      "        [ 5.6903],\n",
      "        [ 6.2652]])\n",
      "tensor([[-0.6313, -0.2985],\n",
      "        [-0.4312, -0.7603],\n",
      "        [ 1.3879, -1.2439],\n",
      "        [-0.1492, -0.9368],\n",
      "        [-0.5746, -2.4745],\n",
      "        [-0.0351, -0.6537],\n",
      "        [ 0.6336,  1.2876],\n",
      "        [-0.9016,  0.8156],\n",
      "        [-0.8867, -1.5690],\n",
      "        [-0.9675, -1.9987]]) tensor([[ 3.9443],\n",
      "        [ 5.9293],\n",
      "        [11.2055],\n",
      "        [ 7.0819],\n",
      "        [11.4654],\n",
      "        [ 6.3506],\n",
      "        [ 1.0843],\n",
      "        [-0.3839],\n",
      "        [ 7.7515],\n",
      "        [ 9.0501]])\n",
      "tensor([[ 1.3219e+00, -8.3739e-01],\n",
      "        [-1.6889e-01, -4.3039e-01],\n",
      "        [-1.7140e+00,  2.2640e-01],\n",
      "        [-4.8677e-01, -1.5639e+00],\n",
      "        [-5.8110e-01, -7.5810e-01],\n",
      "        [ 3.6001e-01, -1.0819e+00],\n",
      "        [ 8.7828e-01,  9.8072e-01],\n",
      "        [ 6.7624e-04,  9.2932e-01],\n",
      "        [-5.7146e-01,  1.6825e+00],\n",
      "        [-1.0166e+00,  1.1610e-01]]) tensor([[ 9.6714],\n",
      "        [ 5.3195],\n",
      "        [-0.0145],\n",
      "        [ 8.5390],\n",
      "        [ 5.6211],\n",
      "        [ 8.5891],\n",
      "        [ 2.6322],\n",
      "        [ 1.0360],\n",
      "        [-2.6688],\n",
      "        [ 1.7543]])\n",
      "tensor([[ 1.6391, -0.6472],\n",
      "        [-1.2391,  0.1756],\n",
      "        [-0.7099,  2.1028],\n",
      "        [ 0.5644, -1.4056],\n",
      "        [-0.3639, -1.9725],\n",
      "        [-0.5270,  0.8340],\n",
      "        [-1.0523,  1.6986],\n",
      "        [ 1.5040, -1.2873],\n",
      "        [ 1.4015,  0.4256],\n",
      "        [ 1.9058, -0.2345]]) tensor([[ 9.6827],\n",
      "        [ 1.1318],\n",
      "        [-4.3775],\n",
      "        [10.1079],\n",
      "        [10.1716],\n",
      "        [ 0.3076],\n",
      "        [-3.6748],\n",
      "        [11.5886],\n",
      "        [ 5.5484],\n",
      "        [ 8.8178]])\n",
      "tensor([[ 0.4001,  0.9758],\n",
      "        [-0.3633, -0.6810],\n",
      "        [ 0.2688, -0.0554],\n",
      "        [ 1.0516,  0.4518],\n",
      "        [-1.0160, -1.7671],\n",
      "        [-0.4468,  0.1752],\n",
      "        [-1.9747,  0.1354],\n",
      "        [-0.4584,  0.6072],\n",
      "        [-0.2178, -0.2725],\n",
      "        [ 0.6640, -0.8701]]) tensor([[ 1.6951],\n",
      "        [ 5.8059],\n",
      "        [ 4.9342],\n",
      "        [ 4.7744],\n",
      "        [ 8.1687],\n",
      "        [ 2.7194],\n",
      "        [-0.2213],\n",
      "        [ 1.2097],\n",
      "        [ 4.7040],\n",
      "        [ 8.4896]])\n",
      "tensor([[ 0.4523, -0.7543],\n",
      "        [-1.0969, -0.4584],\n",
      "        [-1.6109, -0.6243],\n",
      "        [-0.5256,  0.6860],\n",
      "        [-0.3834, -0.7990],\n",
      "        [-0.5488, -0.7875],\n",
      "        [ 1.3065,  1.1842],\n",
      "        [-1.8699, -0.2930],\n",
      "        [ 0.8164, -0.2328],\n",
      "        [ 0.6425,  0.7865]]) tensor([[7.6769],\n",
      "        [3.5594],\n",
      "        [3.1035],\n",
      "        [0.8240],\n",
      "        [6.1659],\n",
      "        [5.7931],\n",
      "        [2.7865],\n",
      "        [1.4597],\n",
      "        [6.5953],\n",
      "        [2.7936]])\n",
      "tensor([[ 1.2119, -1.7121],\n",
      "        [-0.3750, -1.0593],\n",
      "        [ 1.5737, -1.7086],\n",
      "        [ 0.7756,  2.3384],\n",
      "        [-1.0799,  1.8153],\n",
      "        [-0.8570,  0.6591],\n",
      "        [ 0.4775, -1.0128],\n",
      "        [-0.1434,  0.0178],\n",
      "        [-1.5245,  1.0056],\n",
      "        [ 1.8170, -0.9504]]) tensor([[12.4384],\n",
      "        [ 7.0565],\n",
      "        [13.1515],\n",
      "        [-2.2097],\n",
      "        [-4.1106],\n",
      "        [ 0.2532],\n",
      "        [ 8.5985],\n",
      "        [ 3.8633],\n",
      "        [-2.2652],\n",
      "        [11.0603]])\n",
      "tensor([[ 1.0646,  0.6229],\n",
      "        [ 0.8199, -0.4231],\n",
      "        [ 0.8168, -0.1819],\n",
      "        [-0.7805, -0.6847],\n",
      "        [ 2.5917, -0.2777],\n",
      "        [ 0.9209, -2.1458],\n",
      "        [ 0.7087,  0.6634],\n",
      "        [ 0.3359, -0.6455],\n",
      "        [ 1.3485, -1.4890],\n",
      "        [ 0.3243,  0.0439]]) tensor([[ 4.2193],\n",
      "        [ 7.2734],\n",
      "        [ 6.4492],\n",
      "        [ 4.9918],\n",
      "        [10.3479],\n",
      "        [13.3279],\n",
      "        [ 3.3765],\n",
      "        [ 7.0700],\n",
      "        [11.9719],\n",
      "        [ 4.7078]])\n",
      "tensor([[-0.0127, -0.4110],\n",
      "        [ 1.2954,  0.0040],\n",
      "        [-2.3925,  0.2769],\n",
      "        [-0.8332,  0.4920],\n",
      "        [-1.6354,  0.9377],\n",
      "        [-0.7326,  1.2625],\n",
      "        [ 2.4005, -2.3523],\n",
      "        [ 0.3257,  1.1649],\n",
      "        [ 0.0968,  0.1868],\n",
      "        [-2.0481, -0.6538]]) tensor([[ 5.5695],\n",
      "        [ 6.7932],\n",
      "        [-1.5155],\n",
      "        [ 0.8421],\n",
      "        [-2.2368],\n",
      "        [-1.5446],\n",
      "        [16.9860],\n",
      "        [ 0.8932],\n",
      "        [ 3.7398],\n",
      "        [ 2.3330]])\n",
      "tensor([[-0.5286,  1.0524],\n",
      "        [ 0.8698, -1.7687],\n",
      "        [-2.0484,  0.7453],\n",
      "        [-0.2098,  1.6872],\n",
      "        [-0.4159, -0.6504],\n",
      "        [-1.4667,  0.2410],\n",
      "        [-1.1261, -0.4799],\n",
      "        [ 1.3665, -0.0776],\n",
      "        [-0.2321,  1.1459],\n",
      "        [ 0.6096, -0.2057]]) tensor([[-0.4501],\n",
      "        [11.9428],\n",
      "        [-2.4430],\n",
      "        [-1.9610],\n",
      "        [ 5.5676],\n",
      "        [ 0.4394],\n",
      "        [ 3.5806],\n",
      "        [ 7.1963],\n",
      "        [-0.1640],\n",
      "        [ 6.1153]])\n",
      "tensor([[-0.4486, -1.3482],\n",
      "        [-1.1836,  0.7038],\n",
      "        [ 1.0846, -0.3922],\n",
      "        [ 0.1399,  0.4297],\n",
      "        [ 0.0093, -1.4031],\n",
      "        [ 0.1082,  0.1429],\n",
      "        [ 2.2777, -0.2468],\n",
      "        [ 0.5796,  1.3506],\n",
      "        [-1.3716,  0.6333],\n",
      "        [-1.0899, -1.1361]]) tensor([[ 7.8848],\n",
      "        [-0.5585],\n",
      "        [ 7.7081],\n",
      "        [ 3.0045],\n",
      "        [ 8.9785],\n",
      "        [ 3.9055],\n",
      "        [ 9.5829],\n",
      "        [ 0.7746],\n",
      "        [-0.7000],\n",
      "        [ 5.8880]])\n",
      "tensor([[ 0.9598,  0.4231],\n",
      "        [ 0.1477,  0.3835],\n",
      "        [-1.6519, -0.8084],\n",
      "        [ 1.2294, -0.0083],\n",
      "        [-0.4851, -0.0713],\n",
      "        [-0.2577, -1.6080],\n",
      "        [-0.3279,  0.9587],\n",
      "        [-1.1116,  1.5408],\n",
      "        [ 0.3205,  1.7000],\n",
      "        [ 0.8357, -0.7074]]) tensor([[ 4.6887],\n",
      "        [ 3.2008],\n",
      "        [ 3.6404],\n",
      "        [ 6.6908],\n",
      "        [ 3.4644],\n",
      "        [ 9.1514],\n",
      "        [ 0.2668],\n",
      "        [-3.2542],\n",
      "        [-0.9311],\n",
      "        [ 8.2899]])\n",
      "tensor([[ 0.4238, -0.4425],\n",
      "        [-0.6406,  0.2118],\n",
      "        [ 1.5088,  0.9211],\n",
      "        [ 0.7218, -1.6865],\n",
      "        [ 1.4007, -1.4417],\n",
      "        [-0.9343,  0.3707],\n",
      "        [-0.6641,  1.1353],\n",
      "        [ 0.2846,  0.9590],\n",
      "        [-1.1488,  0.3326],\n",
      "        [ 0.1341,  1.6721]]) tensor([[ 6.5587],\n",
      "        [ 2.1882],\n",
      "        [ 4.0919],\n",
      "        [11.3729],\n",
      "        [11.9071],\n",
      "        [ 1.0975],\n",
      "        [-0.9886],\n",
      "        [ 1.5038],\n",
      "        [ 0.7705],\n",
      "        [-1.2065]])\n",
      "tensor([[ 0.3756, -0.8112],\n",
      "        [ 0.3749,  1.3593],\n",
      "        [-0.6344,  1.4455],\n",
      "        [-0.8481,  0.4439],\n",
      "        [-1.1883,  0.8490],\n",
      "        [ 0.3798,  0.7181],\n",
      "        [ 2.2358, -0.2372],\n",
      "        [-0.3179,  1.3329],\n",
      "        [-0.4731,  2.1444],\n",
      "        [-1.3982,  0.1998]]) tensor([[ 7.7210],\n",
      "        [ 0.3180],\n",
      "        [-1.9799],\n",
      "        [ 0.9954],\n",
      "        [-1.0722],\n",
      "        [ 2.5257],\n",
      "        [ 9.4886],\n",
      "        [-0.9719],\n",
      "        [-4.0373],\n",
      "        [ 0.7240]])\n",
      "tensor([[ 1.8612,  0.8687],\n",
      "        [-0.9576, -1.2003],\n",
      "        [-0.1781,  0.3542],\n",
      "        [-1.1429,  0.1615],\n",
      "        [-0.8842, -0.2718],\n",
      "        [-0.3304, -0.8473],\n",
      "        [-0.3672,  0.8769],\n",
      "        [-0.6262, -1.1057],\n",
      "        [-1.4130,  0.7228],\n",
      "        [ 0.6947, -0.5098]]) tensor([[ 4.9597],\n",
      "        [ 6.3690],\n",
      "        [ 2.6409],\n",
      "        [ 1.3747],\n",
      "        [ 3.3402],\n",
      "        [ 6.4105],\n",
      "        [ 0.4724],\n",
      "        [ 6.6914],\n",
      "        [-1.0820],\n",
      "        [ 7.3069]])\n",
      "tensor([[ 0.4635, -0.8761],\n",
      "        [-0.7040, -1.9354],\n",
      "        [ 0.6050,  0.5763],\n",
      "        [-0.1283, -0.7222],\n",
      "        [-2.0259, -0.2007],\n",
      "        [ 1.5215,  0.8312],\n",
      "        [ 1.7557,  0.3905],\n",
      "        [-0.8961, -0.3440],\n",
      "        [-0.2383, -0.8165],\n",
      "        [ 0.2946,  0.6562]]) tensor([[8.1047],\n",
      "        [9.3640],\n",
      "        [3.4613],\n",
      "        [6.3995],\n",
      "        [0.8140],\n",
      "        [4.4060],\n",
      "        [6.4001],\n",
      "        [3.5684],\n",
      "        [6.5041],\n",
      "        [2.5584]])\n",
      "tensor([[ 0.4064, -0.3211],\n",
      "        [-0.6621, -0.2573],\n",
      "        [ 0.8991,  1.4920],\n",
      "        [-0.5479, -2.3476],\n",
      "        [ 0.3993,  1.0878],\n",
      "        [ 1.5233, -0.0762],\n",
      "        [ 1.0507,  0.4259],\n",
      "        [-0.5693,  2.1617],\n",
      "        [ 0.1577, -0.8837],\n",
      "        [-2.3701,  0.7012]]) tensor([[ 6.1063],\n",
      "        [ 3.7311],\n",
      "        [ 0.9345],\n",
      "        [11.0847],\n",
      "        [ 1.2930],\n",
      "        [ 7.4974],\n",
      "        [ 4.8434],\n",
      "        [-4.3004],\n",
      "        [ 7.5143],\n",
      "        [-2.9178]])\n",
      "tensor([[ 0.9415,  0.6252],\n",
      "        [-0.8637, -0.9867],\n",
      "        [-1.1013, -0.3609],\n",
      "        [-0.9781, -1.1594],\n",
      "        [ 0.6710,  0.8703],\n",
      "        [ 1.3317,  0.7279],\n",
      "        [-0.5305,  0.5713],\n",
      "        [-0.3442,  0.8185],\n",
      "        [-0.0660, -0.8301],\n",
      "        [-0.2550,  1.0970]]) tensor([[ 3.9663],\n",
      "        [ 5.8051],\n",
      "        [ 3.2204],\n",
      "        [ 6.1903],\n",
      "        [ 2.5754],\n",
      "        [ 4.3919],\n",
      "        [ 1.2183],\n",
      "        [ 0.7173],\n",
      "        [ 6.9087],\n",
      "        [-0.0340]])\n",
      "tensor([[-0.5941, -1.0176],\n",
      "        [ 0.0474,  0.2923],\n",
      "        [ 0.3559,  1.2916],\n",
      "        [-0.3529,  0.7808],\n",
      "        [-0.5994,  1.3650],\n",
      "        [-0.1069,  2.6125],\n",
      "        [-0.1194, -0.6307],\n",
      "        [ 0.5235, -0.6472],\n",
      "        [-0.7873,  1.3238],\n",
      "        [ 1.4088,  1.7473]]) tensor([[ 6.4648],\n",
      "        [ 3.3008],\n",
      "        [ 0.5210],\n",
      "        [ 0.8478],\n",
      "        [-1.6411],\n",
      "        [-4.8965],\n",
      "        [ 6.1010],\n",
      "        [ 7.4265],\n",
      "        [-1.8616],\n",
      "        [ 1.0670]])\n",
      "tensor([[ 0.2228,  0.1174],\n",
      "        [ 1.9996,  0.7504],\n",
      "        [ 2.5571, -0.9330],\n",
      "        [-0.6240, -2.3141],\n",
      "        [ 0.3972,  0.1956],\n",
      "        [ 0.1667,  0.4966],\n",
      "        [-0.5996,  0.1287],\n",
      "        [-0.0800, -1.1246],\n",
      "        [-0.6784, -1.5283],\n",
      "        [-2.1970,  0.6829]]) tensor([[ 4.2253],\n",
      "        [ 5.6562],\n",
      "        [12.4921],\n",
      "        [10.8156],\n",
      "        [ 4.3304],\n",
      "        [ 2.8433],\n",
      "        [ 2.5686],\n",
      "        [ 7.8508],\n",
      "        [ 8.0522],\n",
      "        [-2.5071]])\n"
     ]
    }
   ],
   "source": [
    "# 测试上面的批量生成\n",
    "for x,y in data_choose_batch(10,X,Y):\n",
    "    print(x,y)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.0172],\n",
       "        [-0.0086]], requires_grad=True)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 初始化模型权重\n",
    "w = torch.normal(0, 0.01,(2,1))\n",
    "w.requires_grad = True\n",
    "b = torch.zeros(1,requires_grad=True)\n",
    "w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([3., 3., 3.])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 定义模型\n",
    "def linearmodel(X, w, b):\n",
    "    return torch.matmul(X,w) + b\n",
    "\n",
    "linearmodel(torch.Tensor([[1,1],[1,1],[1,1]]),torch.Tensor([1,2]),0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义损失函数\n",
    "def squard_loss(y_hat, y):\n",
    "    return (y - y_hat)**2/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义优化算法\n",
    "def sgd(params, lr, batch_size):\n",
    "    with torch.no_grad():\n",
    "        for param in params:\n",
    "            param -= lr * param.grad / batch_size\n",
    "            param.grad.zero_()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[epoch0]loss: 0.03924134373664856\n",
      "[epoch1]loss: 0.0001514929172117263\n",
      "[epoch2]loss: 5.2490147936623544e-05\n",
      "w的估计误差: tensor([[-5.3167e-05],\n",
      "        [-2.4915e-04]], grad_fn=<SubBackward0>)\n",
      "b的估计误差: tensor([0.0008], grad_fn=<RsubBackward1>)\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "lr = 0.03\n",
    "num_epochs = 3\n",
    "net = linearmodel\n",
    "loss = squard_loss\n",
    "batch_size = 10\n",
    "for epoch in range(num_epochs):\n",
    "    for x, y in data_choose_batch(batch_size, X, Y):\n",
    "        l = loss(net(x, w, b),y)\n",
    "        # print(x)\n",
    "        # print(w)\n",
    "        # print(net(x, w, b))\n",
    "        # print(y)\n",
    "        # break\n",
    "        l.sum().backward()\n",
    "        sgd([w,b], lr, batch_size)\n",
    "    with torch.no_grad():\n",
    "        train_l = loss(net(X, w, b),Y)\n",
    "        print(f\"[epoch{epoch}]loss: {train_l.mean()}\")\n",
    "print(f'w的估计误差: {true_w - w}')\n",
    "print(f'b的估计误差: {true_b - b}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
